package com.datalinkx.driver.dsdriver;

import com.datalinkx.common.utils.ObjectUtils;
import com.datalinkx.driver.dsdriver.base.model.DbTableField;
import com.datalinkx.driver.dsdriver.base.model.DbTree;
import com.datalinkx.driver.dsdriver.base.model.FlinkActionMeta;
import org.apache.commons.lang3.StringUtils;

import java.util.List;

/**
 * @author 山顶洞人郑某
 * @className IDsReader.java 读取的数据库抽象驱动
 * @date 2025 03 16
 */
public interface IDsReader extends IDsDriver {
    // 查询最大值，用于下一次同步的增量条件
    String retrieveMax(FlinkActionMeta param, String field) throws Exception;

    // 获取jobGraph reader信息
    Object getReaderInfo(FlinkActionMeta param) throws Exception;

    // 获取数据源下的表信息
    List<DbTree.DbTreeTable> treeTable(String catalog, String schema) throws Exception;

    // 获取指定数据表下的字段列表
    List<DbTableField> getFields(String catalog, String schema, String tableName) throws Exception;

    // 判断字段是否为合法的增量字段
    default Boolean judgeIncrementalField(String catalog, String schema, String tableName, String field) throws Exception {
        return false;
    }

    // 生成where条件
    default String genWhere(FlinkActionMeta unit) throws Exception {
        if (unit.getReader().getSync().getSyncCondition() != null) {
            //1. 获取增量字段
            String field = unit.getReader().getSync().getSyncCondition().getField();
            //2. 获取增量字段类型
            String fieldType = unit.getReader().getSync().getSyncCondition().getFieldType();

            //通过工厂模式获取读取数据源的驱动
            IDsReader readDsDriver = DsDriverFactory.getDsReader(unit.getReader().getConnectId());

            //3. 如果不是首次增量同步，就读取上一次同步字段的最大值
            if (!StringUtils.isEmpty(unit.getReader().getMaxValue())) {
                String maxValue = unit.getReader().getMaxValue();

                //3.1 更新下一次的增量条件 具体更新逻辑由具体数据源的实现类去做
                String nextMaxValue = readDsDriver.retrieveMax(unit, field);
                if (!ObjectUtils.isEmpty(nextMaxValue)) {
                    unit.getReader().setMaxValue(nextMaxValue);
                }

                return String.format("%s %s %s", wrapColumnName(field),
                        unit.getReader().getSync().getSyncCondition().getStart().getOperator(),
                        wrapValue(fieldType, maxValue));
            }
            // 4 如果是首次增量同步，则直接返回增量字段的where条件
            String nextMaxValue = readDsDriver.retrieveMax(unit, field);
            if (!ObjectUtils.isEmpty(nextMaxValue)) {
                unit.getReader().setMaxValue(nextMaxValue);
            }
        }
        return "(1 = 1) ";
    }


}
